package utils

import (
	"fmt"
	"os"
	"runtime"
	"strings"
)

// 退出程序，这种退出方式是通过系统来杀死进程的，而os.exit是通过go语言来退出的
func Exit() {
	process, err := os.FindProcess(os.Getpid())
	if err != nil {
		fmt.Println("获取进程信息失败:", err)
		return
	}
	err1 := process.Kill()
	if err1 != nil {
		fmt.Println("杀死进程失败:", err)
		return
	}
}

// 获取当前是什么系统
func GetSystem() string {
	return runtime.GOOS
}

// 获取当前系统的架构
func GetArch() string {
	return runtime.GOARCH
}

// 获取当前系统的cpu核心数
func GetCpuNum() int {
	return runtime.NumCPU()
}

// 获取当前程序分配的总内存,单位MB(实时的)
func GetMem() float64 {
	var m runtime.MemStats
	runtime.ReadMemStats(&m)
	return float64(m.HeapAlloc) / 1024 / 1024
}

// 获取当前程序使用的协程数
func GetNumGoroutine() int {
	goroutine := runtime.NumGoroutine()

	return goroutine
}

// 获取系统环境变量
func GetEnv(key string) string {
	return os.Getenv(key)
}

// 添加系统环境变量，如果存在则覆盖
func SetEnv(key string, value string) {
	exist := IsEnvExist(key)
	if exist {
		UnsetEnv(key)
	}
	os.Setenv(key, value)
}

// 添加path环境变量
func SetPathEnv(value string) {
	path := GetEnv("PATH")
	//判断path是否已经存在
	if strings.Contains(path, path) {
		return
	}
	//判断是：还是;
	if strings.Contains(path, ":") {
		//判断结尾是否有分号，没有则添加
		if path[len(path)-1] != ':' {
			path += ":"
		}
	}
	if strings.Contains(path, ";") {
		//判断结尾是否有分号，没有则添加
		if path[len(path)-1] != ';' {
			path += ";"
		}
	}

	SetEnv("PATH", path+value)
}

// 删除path环境变量
func UnsetPathEnv(value string) {
	path := GetEnv("PATH")
	//判断path是否已经存在
	if !strings.Contains(path, value) {
		return
	}
	//判断是：还是;
	if strings.Contains(path, ":") {
		path = strings.Replace(path, ":"+value, "", -1)
	}
	if strings.Contains(path, ";") {
		path = strings.Replace(path, ";"+value, "", -1)
	}
	SetEnv("PATH", path)
}

// 将当前程序所在目录添加到path环境变量
func SetCurrentPathToPathEnv() {
	path := GetCurrentPath()
	//判断path是否已经存在
	if strings.Contains(path, GetEnv("PATH")) {
		return
	}
	SetPathEnv(path)
}

// 获取当前程序所在目录
func GetCurrentPath() string {
	path, err := os.Getwd()
	if err != nil {
		fmt.Println("获取当前程序所在目录失败:", err)
		return ""
	}
	return path
}

// 删除系统环境变量
func UnsetEnv(key string) {
	err := os.Unsetenv(key)
	if err != nil {
		return
	}
}

// 判断系统环境变量是否存在
func IsEnvExist(key string) bool {
	_, ok := os.LookupEnv(key)
	return ok
}

// 全部系统环境变量
func Environ() map[string]string {
	var env = make(map[string]string)
	for _, v := range os.Environ() {
		//分割=号
		kv := strings.Split(v, "=")
		env[kv[0]] = kv[1]
	}
	return env
}

// 获取进程id
func GetPid() int {
	return os.Getpid()
}

// 杀死指定pid的进程
func KillPid(pid int) {
	process, err := os.FindProcess(pid)
	if err != nil {
		fmt.Println("获取进程信息失败:", err)
		return
	}
	err1 := process.Kill()
	if err1 != nil {
		fmt.Println("杀死进程失败:", err)
		return
	}
}

// 启动一个进程，返回进程id
func StartProcess(path string, args ...string) int {
	process, err := os.StartProcess(path, args, nil)
	if err != nil {
		fmt.Println("启动进程失败:", err)
		return -1
	}
	return process.Pid
}

// 等待一个进程结束，并返回进程的状态码
func WaitProcess(pid int) int {
	process, err := os.FindProcess(pid)
	if err != nil {
		fmt.Println("获取进程信息失败:", err)
		return -1
	}
	state, err1 := process.Wait()
	if err1 != nil {
		fmt.Println("等待进程失败:", err)
		return -1
	}
	return state.ExitCode()
}
